<p>默认情况下，JVM退出时运行终结器是禁用的。可以使用<code> System.runFinalizersOnExit </code>和<code> Runtime.runFinalizersOnExit </code>启用它，但是不推荐使用这两种方法，因为它们本质上是不安全的。 </p>
<p>根据Oracle Javadoc：</p>
<blockquote>
<p>这可能会导致在活动对象上调用终结器，而其他线程正在同时操纵这些对象，从而导致行为不稳定或死锁。</p>
</blockquote>
<p>如果您真的想在虚拟机开始其关闭序列时执行某些操作，则应附加一个关闭挂钩。 </p>
<h2>不规范代码示例</h2>

<pre>
public static void main(String [] args) {
  ...
  System.runFinalizersOnExit(true);  // 不合规
  ...
}

protected void finalize(){
  doSomething();
}
</pre>
<h2>正确的代码示例</h2>

<pre>
public static void main(String [] args) {
  Runtime.addShutdownHook(new Runnable() {
    public void run(){
      doSomething();
    }
  });
  //...
</pre>
<h2>更多</h2>

<ul>
<li> <a href="https://www.securecoding.cert.org/confluence/x/H4cbAQ">CERT, MET12-J</a> - Do not use finalizers</li>
</ul>
